
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from mpl_toolkits .mplot3d import Axes3D


## 1.
# # # 创建一个空的画板
# fig = plt.figure()
#
# #用 .add_subplot(n,m) 创建n行m列的画布
# #ax1接收第一个画布
# ax1 = fig.add_subplot(1,2,1) #最后一个参数1代表第一个画布
#
# #xlim 和ylim分别设置X轴和Y轴的坐标， ylabel和xlabel分别设置Y轴和X轴的名，title 设置坐标的标题
# # 默认的编码和字体支持英文呢字符，如果使用中文需要额外的配置
# ax1.set(xlim=[0,5], ylim=[0,6], ylabel="Y", xlabel= "X",title= "Test") #下一标题会详讲这里的参数
#
# #开始画图， X轴的参数在左边，Y轴的参数在右边
# ax1.plot([1,2,3,4],[1,2,3,4])
#
# #ax2接收第二个画布，第二个画布不进行绘画
# ax2 = fig.add_subplot(1,2,2)#最后一个参数2代表第二个画布

# #打印
# plt.show()


## 2.

# # 创建画板
# fig = plt.figure()
# #创建画布
# ax = fig.add_subplot()
#
# #设置属性
# ax.set(title="y=x*x", ylabel="Y", xlabel="X", xlim=(-50,50),
#        yticks=(600,1200,1800,2400,3000), yticklabels=("level1","level2", "level3", "level4","level5"))
#
# #生成数据
# x = np.arange(-50,50)
# y = x**2
#
# # ## 绘图
# ax.plot(x,y)
# plt.show()


##3.

# #创建一个画板
# fig = plt.figure()
#
# #创建一个画布
# ax = fig.add_subplot()
#
# #设置属性
# ax.set(title="Test", ylabel="Y", xlabel="X", xticks=np.arange(-50,51,20),
#        yticks=(500,1000,1500,2000,2500), yticklabels=("level1","level2","level3","level4","level5"))
#
# # 生成数据
# x = np.arange(-50,50)
#
# ## 绘图
# ax.plot(x,x,label = "y=x")
# ax.plot(x,10*x,label = "y=10x")
# ax.plot(x,x**2, label= "y=x**2")
#
# #显示图例，这样就可以清楚地区分每一条线代表的函数
# ax.legend(loc = "upper left")
#
# #打印
# plt.show()


## 设置中文
# import matplotlib.pyplot as plt
# from matplotlib import font_manager
# for font in font_manager.fontManager.ttflist:
#     # 查看字体名以及对应的字体文件名
#     print(font.name, '- -', font.fname)
#
# # 输出的“KaiTi - - C:\Windows\Fonts\simkai.ttf”
# # 中，“KaiTi”为字体名，“C:\Windows\Fonts\simkai.ttf”为对应的字体文件。则可以用如下语句来使用该字体，如下所示：
#
# plt.rcParams['font.family']=' KaiTi '
# plt.text(0.5,0.5,'楷体',ha='center',fontsize=50)


# ## 设置中文

# #  在开头设置中文字体
# mpl.rcParams['font.family'] = "Microsoft YaHei"
# #设置正常显示符号
# mpl.rcParams['axes.unicode_minus'] = False
# #设置字体字号
# mpl.rcParams['font.size'] = 12
#
# ## 注： 上述三行代码必须放在前面
#
# #创建画板
# fig = plt.figure()
#
# #创建画布
# ax = fig.add_subplot()
#
# #设置属性
# ax.set(xlabel="X轴", ylabel="Y轴", title="测试标题" ,xlim =(0,10), ylim=(0,10))
#
# #生成数据
# x = np.arange(11)
# y=x
#
# #绘图
# ax.plot(x,y)
# plt.show()


# ## 在属性中设置中文
# #创建画板
# fig = plt.figure()
#
# #创建画布
# ax = fig.add_subplot()
#
# #设置属性
# ax.set(xlim =(0,10), ylim=(0,10))
#
# ## 用plt设置属性
# plt.xlabel("X轴", fontproperties = "Microsoft YaHei", fontsize = 12)
# plt.ylabel("Y轴",fontproperties = "Microsoft YaHei", fontsize = 12)
# plt.title("测试坐标轴",fontproperties = "Microsoft YaHei", fontsize = 12)
#
# #生成数据
# x = np.arange(11)
# y=x
#
# #绘图
# ax.plot(x,y)
# plt.show()


# ## plt()添加参数
# #创建一个画板
# fig = plt.figure()
#
# #创建一个画布
# ax = fig.add_subplot()
#
# #设置属性
# ax.set(title="Test", ylabel="Y", xlabel="X", xticks=np.arange(-50,51,20),
#        yticks=(500,1000,1500,2000,2500), yticklabels=("level1","level2","level3","level4","level5"))
#
# # 生成数据
# x = np.arange(-50,50)
#
# ## 绘图
#
# ax.plot(x,x,label = "y=x", color="m", linestyle="-.") #品红色的点划线
# ax.plot(x,10*x,label = "y=10x", color="g", linestyle="-") #绿色的实现
# ax.plot(x,x**2, label= "y=x**2", color="r", linestyle="--", marker= "o") #红色的虚线
#
# #显示图例，这样就可以清楚地区分每一条线代表的函数
# ax.legend(loc = "upper left")
#
# #打印
# plt.show()


## 添加标注

# #创建画板
# fig= plt.figure()
#
# #创建画图
# ax = fig.add_subplot()
#
# #设置属性
# ax.set(xlabel= "X", ylabel="Y", xlim=(0,4),ylim=(0,4))
#
# #绘图
# ax.plot(np.arange(4),np.arange(4))
#
# #添加标注
# # 在坐标（3,2,5）处添加 y=x 标记
# ax.text(3,2.5,"y=x")
#
# plt.show()


# 添加注释

# fig= plt.figure()
# ax = fig.add_subplot()
#
# ax.set(xlabel = "X", ylabel= "Y", xlim=(-3,7), ylim=(0,10))
#
# #生成数据
# x = np.arange(-2,4,0.01)
# y = -1*(x**2)+9
#
# #绘图
# ax.plot(x,y)
#
# #添加注释
# ax.annotate("Max",xy=(0,9), xytext=(2,9.5), arrowprops=dict(arrowstyle="->") )
#
# plt.savefig("test.jpg", dpi=600, bbox_inches="tight" )
# plt.show()


#创建子图
#
# #创建画板
# fig = plt.figure()
#
# #创建一个 2X2 的子图（画布），
# # fig.add_subplot(2,2,1) 创建的是左上角的子图
# ax1 = fig.add_subplot(2,2,1)
# ax1.plot([1,2],[1,2])
#
# # fig.add_subplot(2,2,) 创建的是右上角的子图
# ax2 = fig.add_subplot(2,2,2)
# ax2.plot(np.arange(2,0,-0.1),np.arange(0.1,2.1,0.1))
#
# # fig.add_subplot(2,2,3) 创建的是左下角的子图
# ax3 = fig.add_subplot(2,2,3)
# x= np.arange(0,2,0.1)
# ax3.plot(x,x**2)
#
# # fig.add_subplot(2,2,3) 创建的是右下角的子图
# ax4 = fig.add_subplot(2,2,4)
# ax4.plot(x,-1*(x**2)+4)
#
# plt.show()


# ## 创建复杂子图
# fig = plt.figure()
#
# # 法一：
# # ax = fig.subplot_mosaic([["left","right1"],
# #                      ["left","right2"]])
#
# # 法二：
# ax = fig.subplot_mosaic([[1,2],
#                      [1,4]])
#
# x = np.arange(-2,2.1,0.1)
# y = x**2
# ax[1].plot(x,y)
#
# ax[2].plot([0,2],[2,0])
# ax[4].plot([0,2],[0,2])
#
# plt.show()


## 散点图

# fig = plt.figure()
# ax = fig.add_subplot()
#
# #生成数据
# x = np.random.normal(0,1,500)
# y = np.random.normal(0,1,500)
#
# # s=50:每个点的大小为50,
# # c='b'： 点为蓝色,
# # alpha= 0.5 ：表示每个点的透明度为 0.5，这意味着每个点都有一定的透明效果
# ax.scatter(x,y, s=50, c='b', alpha= 0.5)
#
# plt.show()


## 柱状图

# fig = plt.figure()
# ax = fig.add_subplot()
#
# #生成数据
# x = np.arange(9)
# y1 = np.random.randint(1,10,9)
# y2 = np.random.randint(1,10,9)
#
# label = ["A","B","C","D","E","F","J","H","I"]
#
# #绘图
# width = 0.4
# ax.barh(x - width/2,y1,width, label="Man",tick_label=label, facecolor="lightskyblue", edgecolor="white")
# ax.barh(x + width/2,y2, width,label="Woman", tick_label=label, edgecolor="white")
#
# plt.legend()
#
# plt.show()


## 在柱顶部添加标签
# fig = plt.figure()
# ax = fig.add_subplot()
#
# #生成数据
# x = np.arange(9)
# y1 = np.random.randint(1,10,9)
# y2 = np.random.randint(1,10,9)
#
# label = ["A","B","C","D","E","F","J","H","I"]
#
# #绘图
# width = 0.4
# ax.bar(x - width/2,y1,width, label="Man",tick_label=label, facecolor="lightskyblue", edgecolor="white")
# ax.bar(x + width/2,y2, width,label="Woman", tick_label=label, edgecolor="white")
#
# # 在柱顶部添加数据标签
# for a, b, c in zip(x,y1,y2):
#     ax.text(a-width/2, b+0.1, "%0.f" %b,ha="center", va ="bottom", fontsize=10)
#     ax.text(a + width / 2, c + 0.1, "%0.f" % c, ha="center", va="bottom", fontsize=10)
#
# plt.legend()
#
# plt.show()


## 直方图
# fig = plt.figure()
# ax = fig.add_subplot()
#
# x = np.random.normal(0,1,500)
#
# #绘画直方图
# ax.hist(x,10, color="m", histtype="bar", label="正态分布")
#
# plt.show()

# ## 堆积直方图
# fig = plt.figure()
# ax = fig.add_subplot()
#
# #设置坐标轴属性
# ax.set(xlabel= "score", ylabel = "acount")
#
# #数据
# score1 =np.random.randint(1,101,500)
# score2 = np.random.randint(1,101,500)
#
# # 绘图  当参数stacked设置为False时，也是默认状态，则绘制并排放置的直方图。
# ax.hist([score1,score2],bins=20,label=["class1","class2"],color=["m",'g'],
#         histtype="bar", rwidth=4,stacked=False)
#
# plt.legend()
# plt.show()


# # 饼图
# fig= plt.figure()
# ax = fig.add_subplot()
#
# labels = ["A","B","C","D","E","F"]
# size= np.random.randint(1,100,6)
#
# # 绘画饼图
# ax.pie(size, labels = labels, startangle=90,autopct="%1.1f%%",
#        shadow=False, explode = [0.2,0,0,0.2,0,0])
#
# plt.show()


## 3D模型导入
# from mpl_toolkits .mplot3d import Axes3D
# fig = plt.figure()
# ax = Axes3D(fig)
# plt.show()


fig = plt.figure()
ax = Axes3D(fig)
x = np.arange(-4, 4, 0.25)
y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2+Y**2)
Z = np.sin(R)

# 传入 X, Y, Z 三个参数，cmap='rainbow' 表示颜色映射表
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
plt.show()